package com.ciwong.epaper.util;

import com.ciwong.epaper.application.EApplication;
import com.ciwong.epaper.modules.me.util.MeUtil;
import com.ciwong.libs.utils.CWLog;
import com.ciwong.libs.utils.volley.HttpRequest;
import com.ciwong.mobilelib.bean.BuyMsg;
import com.ciwong.mobilepay.bean.PayDetail;
import com.ciwong.mobilepay.bean.SignParms;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by young on 2016/10/20.
 * 支付相关类
 */
public class PayHelper {
    private static PayHelper instance;

    private PayHelper() {
    }

    ;

    public static PayHelper getInstance() {
        if (null == instance) {
            syn();
        }
        return instance;
    }

    private static synchronized void syn() {
        if (null == instance) {
            instance = new PayHelper();
        }
    }

    //支付唯一入口 得到支付相关信息   传给EMainActivity即可

    public PayDetail getPayDetail(long userId, String realName, String serviceName, String logo,
                                  double total_fee, String body, int goods_num, int buyType,
                                  String notify_url, String out_trade_no, String goods_number,
                                  String goods_type, String goods_version, String pay_source
            , String rightTitle, String secondText, String serviceId, String Buymsg) {
        return getPayDetail(userId, realName, serviceName, logo, total_fee, body, goods_num, buyType,
                notify_url, out_trade_no, goods_number, goods_type, goods_version, pay_source
                , rightTitle, secondText, serviceId, Buymsg, null, 0);
    }

    /**
     * @param userId        用户ID
     * @param realName      用户真实姓名
     * @param serviceName   商品名称
     * @param logo          服务logo
     * @param total_fee     总金额
     * @param body          商品详情
     * @param goods_num     商品数量
     * @param notify_url    服务器异步通知页面路径R
     * @param out_trade_no  商户网站唯一订单
     * @param goods_number  商品编号
     * @param goods_type    商品类型
     * @param goods_version 商品版本
     * @param pay_source    支付来源
     * @param buyType       购买类型
     * @return
     */
    public PayDetail getPayDetail(long userId, String realName, String serviceName, String logo,
                                  double total_fee, String body, int goods_num, int buyType,
                                  String notify_url, String out_trade_no, String goods_number,
                                  String goods_type, String goods_version, String pay_source
            , String rightTitle, String secondText, String serviceId, String Buymsg, String keyCode, float amount) {

        PayDetail payDetail = new PayDetail();
        payDetail.setVerifyInfo(HttpRequest.getVerifyInfo());
        payDetail.setUserId(userId);//用户ID
        payDetail.setKeyCode(keyCode);
        payDetail.setAmount(amount);
//        进行转码，因为服务器购买订单中文名字 信息会乱码--2016/12/29-neo
        try {
            realName = URLEncoder.encode(realName, "utf-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        payDetail.setBuymsg(Buymsg);
        payDetail.setUsername(realName);//用户真实姓名
        // payDetail.setName(servicePriceInfo.getName());

        payDetail.setName(serviceName);//服务名称 这个要查一下哪个接口用到这个参数 目前不确定   商品名称
        payDetail.setIcon(logo);//服务logo
        payDetail.setPrice(total_fee);//该笔订单的资金总额，单位为RMB-Yuan。取值范围为[0.01，100000000.00]，精确到小数点后两位
        //payDetail.setPrice(servicePriceInfo.getPrice());
        //测试时使用一分钱测试
        // payDetail.setPrice(0.01);
        // payDetail.setDesc(servicePriceInfo.getName());
        payDetail.setDesc(body);//对一笔交易的具体描述信息。如果是多种商品，请将商品描述字符串累加传给body。
        if (1 == buyType) {//服务的时候数量都暂时都传1
            payDetail.setNumber(1);
        } else {//其他购买 可以支持多个购买
            payDetail.setNumber(goods_num);
        }

        //服务类型： 月份数量或购买个数；goods_number  类型为14、25 ,27以月为单位，其它类型以年为单位 规定：goods_number  :25,只能是参数（6、12、36）产品类型：为购买的数量。其它类型： 默认为
        //这个只是习币的支付通知   在SDK中支付宝 的通知是固定值  微信和银联是没有通知地址的
        payDetail.setNotifyUrl(notify_url);//支付中心服务器主动通知商户网站里指定的页面http路径。
        //购买类型  1 服务 2  在线报名
        //购买类型  1  服务  2  在线报名
        payDetail.setBuyType(buyType);
        //非服务情况下  标题右上角文体

        payDetail.setTitleRight(rightTitle);
        //非服务情况下  详情的第二行展示内容
        payDetail.setSecondText(secondText);


        //新的渠道签名放在服务器  签名所需参数
        SignParms signParms = new SignParms();
        signParms.setBrandId(EApplication.BRAND_ID);
        signParms.setUserName(realName);
        signParms.setUserId(userId);
        if (1 == buyType) {//服务的时候数量都暂时都传1
            signParms.setGoods_num(goods_num);
        } else {//其他购买 可以支持多个购买
            signParms.setGoods_num(goods_num);
        }
        //支付类型在里面确认
        //signParms.setRechargeType();
        signParms.setTotal_fee(total_fee - amount);
        if (1 == buyType) {//服务的时候数量都暂时都传
            signParms.setServiceId(serviceId);
        } else {//其他购买
            signParms.setServiceId("");
        }
        payDetail.setSingParms(signParms);


        //buyMsg请求参数
        BuyMsg bugMsg = new BuyMsg();
        //购买服务的时候   支付宝   微信   银联 传""空
        if (1 == buyType) {//购买服务的时候  第三方支付的通知URL不需要签名
            bugMsg.setNotify_url("");
        } else {//其它则需要
            bugMsg.setNotify_url(notify_url);
        }

        //写固定值
        bugMsg.setApp_id("external");
        //android 传3
        bugMsg.setAppenv("3");
        //服务订单号  服务的时候穿空字符串
        bugMsg.setOut_trade_no(out_trade_no);
        //商品名称
        bugMsg.setSubject(serviceName);
        //支付类型。默认值为：1（商品购买）
        bugMsg.setPayment_type("1");
        //该笔订单的资金总额，单位为RMB-Yuan。取值范围为[0.01，100000000.00]，精确到小数点后两位
        //这里不需要取2位的处理 在ｊａｒ包中会统一处理
        bugMsg.setTotal_fee((total_fee - amount) + "");
        //对一笔交易的具体描述信息。如果是多种商品，请将商品描述字符串累加传给body
        bugMsg.setBody(body);
        //商品数量
        bugMsg.setGoods_num(goods_num + "");
        //商品编号
        bugMsg.setGoods_number(goods_number);
        //具体区分商品类型0:服务 ;1：书籍 ;9：其它（报名、投票...）。默认为0
        bugMsg.setGoods_type(goods_type);
        //具体区分商品版本1:个人版;2:班级版;3:校园版。
        bugMsg.setGoods_version(goods_version);
        //1为书城购买，2为开通服务，3为开通考级，4为视频中心，999为其他分类(默认为999)
        bugMsg.setPay_source(pay_source);

        payDetail.setBuyMsgs(concatBuyMsg(bugMsg));
        payDetail.setTypeId(EApplication.TYPE_ID);
        //1  直接购买  0 不直接购买
        payDetail.setIsBuy(1);


        return payDetail;
    }

    /**
     * 拼接购买信息
     *
     * @param //服务售价信息      typeId类型为14、25 以月为单位，其它类型以年为单位。规定：typeId :25,只能是参数（6、12、36）
     * @param //versionType 1:个人版;2:班级版;3:校园版
     * @return 之前参数
     * //Service service,int versionType, int mounth
     */
    private List<String> concatBuyMsg(BuyMsg bugMsg) {
        //要按照字母的顺序进行排序  不然不成功
        List<String> s = new ArrayList<String>();
//        s.add("C=" + servicePriceInfo.getMonthcount());
        //改需求后固定为十年
        // s.add("C=" + mounth);
        // s.add("C=" + servicePriceInfo.getMonthcount());
        /*s.add("C=" + mounth);
        // s.add("N=" +servicePriceInfo.getName());
        s.add("N=" + service.getName());
        s.add("S=3");
        s.add("T=" + mService.getId());
        s.add("V=" + versionType);*/

        //增加在线报名之后 新的签名方式和参数

        //编码格式，固定为UTF-8。
        s.add("_input_charset=" + "utf-8");//1
        //标识客户端
        s.add("app_id=" + bugMsg.getApp_id());//2
        //标识客户端来源。参数值内容约定如下：1：WEB; 2:IOS; 3: Android
        s.add("appenv=" + bugMsg.getAppenv());//3
        //对一笔交易的具体描述信息。如果是多种商品，请将商品描述字符串累加传给body。
        s.add("body=" + bugMsg.getBody());//4

        //服务类型： 月份数量或购买个数；
        /*goods_number  类型为14、25 ,27以月为单位，其它类型以年为单位,
                规定：goods_number  :25,只能是参数（6、12、36）;
        产品类型：为购买的数量。
        其它类型： 默认为1。*/
        s.add("goods_num=" + bugMsg.getGoods_num());//5

        //商品主键ID(25:阳光英语报服务)。
        s.add("goods_number=" + bugMsg.getGoods_number());//6

          /*具体区分商品类型。
        0:服务 ;1：书籍 ;
        9：其它（报名、投票...）。
        默认为0*/
        s.add("goods_type=" + bugMsg.getGoods_type());//7

        //具体区分商品版本1:个人版;2:班级版;3:校园版。
        s.add("goods_version=" + bugMsg.getGoods_version());//8

        //支付中心服务器主动通知商户网站里指定的页面http路径。
        s.add("notify_url=" + bugMsg.getNotify_url());//9
        //网站唯一订单号
        s.add("out_trade_no=" + bugMsg.getOut_trade_no());//10
        //1为书城购买，2为开通服务，3为开通考级，4为视频中心，999为其他分类(默认为999)。
        s.add("pay_source=" + bugMsg.getPay_source());//11
        //支付类型。默认值为：1（商品购买）
        s.add("payment_type=" + bugMsg.getPayment_type());//12
        //接口名称，固定值
        s.add("service=" + "create_direct_pay_by_user");//13
        //商品的标题/交易标题/订单标题/订单关键字等。该参数最长为128个汉字。
        s.add("subject=" + bugMsg.getSubject());//14
        //该笔订单的资金总额，单位为RMB-Yuan。取值范围为[0.01，100000000.00]，精确到小数点后两位。
        s.add("total_fee=" + MeUtil.radixPoint(Double.valueOf(bugMsg.getTotal_fee()), 2));//15
        return s;
    }


}
